package JavaCode.random_records.N1401_1500;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author: fangjie
 * @Date: 2020/6/3 8:38 下午
 */
public class N1466_reorder_routes_to_make_all_paths_lead_to_the_city_zero {
    public int minReorder(int n, int[][] connections) {
        List<List<Integer>> graph=new ArrayList<>(n);
        for (int i=0;i<n;i++)graph.add(new ArrayList<>());
        for (int[] conn:connections)
        {
            graph.get(conn[0]).add(conn[1]);
            graph.get(conn[1]).add(-conn[0]);
        }
        return dfs(0,new boolean[n],graph);
    }

    private int dfs(int idx, boolean[] book, List<List<Integer>> graph) {
        int res=0;
        book[idx]=true;
        for (Integer next:graph.get(idx))
        {
            if(book[Math.abs(next)])continue;
            res+=dfs(Math.abs(next),book,graph)+(next>0?1:0);
        }
        return res;
    }
}
/*
n 座城市，从 0 到 n-1 编号，其间共有 n-1 条路线。因此，要想在两座不同城市之间旅行只有唯一一条路线可供选择（路线网形成一颗树）。去年，交通运输部决定重新规划路线，以改变交通拥堵的状况。

路线用 connections 表示，其中 connections[i] = [a, b] 表示从城市 a 到 b 的一条有向路线。

今年，城市 0 将会举办一场大型比赛，很多游客都想前往城市 0 。

请你帮助重新规划路线方向，使每个城市都可以访问城市 0 。返回需要变更方向的最小路线数。

题目数据 保证 每个城市在重新规划路线方向后都能到达城市 0 。

 

示例 1：



输入：n = 6, connections = [[0,1],[1,3],[2,3],[4,0],[4,5]]
输出：3
解释：更改以红色显示的路线的方向，使每个城市都可以到达城市 0 。
示例 2：



输入：n = 5, connections = [[1,0],[1,2],[3,2],[3,4]]
输出：2
解释：更改以红色显示的路线的方向，使每个城市都可以到达城市 0 。
示例 3：

输入：n = 3, connections = [[1,0],[2,0]]
输出：0
 

提示：

2 <= n <= 5 * 10^4
connections.length == n-1
connections[i].length == 2
0 <= connections[i][0], connections[i][1] <= n-1
connections[i][0] != connections[i][1]

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/reorder-routes-to-make-all-paths-lead-to-the-city-zero
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
